package main.impl;

import java.util.ArrayList;
import java.util.List;

import main.api.GPSProblem;
import main.api.GPSRule;
import main.api.GPSState;



public class GPSProblemImpl implements GPSProblem {

	
	private GPSState initState;
	private GPSState goalState;
	private List<GPSRule> rules;
	private Heuristic heuristic;
	
	public GPSProblemImpl(GPSState initState, GPSState goalState, String heuristic, TipoCosto costo){
		this.initState = initState;
		this.goalState = goalState;
		rules = new ArrayList<GPSRule>();
		rules.add(new GPSRuleImpl("blanco 1 izquierda", TipoFicha.blanco1, Movimientos.izquierda, costo));
		rules.add(new GPSRuleImpl("blanco 1 derecha", TipoFicha.blanco1, Movimientos.derecha, costo));
		rules.add(new GPSRuleImpl("blanco 1 arriba", TipoFicha.blanco1, Movimientos.arriba, costo));
		rules.add(new GPSRuleImpl("blanco 1 abajo", TipoFicha.blanco1, Movimientos.abajo, costo));
		rules.add(new GPSRuleImpl("blanco 2 izquierda", TipoFicha.blanco2, Movimientos.izquierda, costo));
		rules.add(new GPSRuleImpl("blanco 2 derecha", TipoFicha.blanco2, Movimientos.derecha, costo));
		rules.add(new GPSRuleImpl("blanco 2 arriba", TipoFicha.blanco2, Movimientos.arriba, costo));
		rules.add(new GPSRuleImpl("blanco 2 abajo", TipoFicha.blanco2, Movimientos.abajo, costo));
		rules.add(new GPSRuleImpl("blancos arriba", TipoFicha.blancoh, Movimientos.arriba, costo));
		rules.add(new GPSRuleImpl("blancos abajo", TipoFicha.blancoh, Movimientos.abajo, costo));
		rules.add(new GPSRuleImpl("blancos izquierda", TipoFicha.blancov, Movimientos.izquierda, costo));
		rules.add(new GPSRuleImpl("blancos derecha", TipoFicha.blancov, Movimientos.derecha, costo));
		
		/*Busco los archivos con los nombres de heur�sticas y los instancio*/
//		for(String heu: heuristics){
//			try {
//				Class x = Class.forName("Heuristic");
//				System.out.println("1");
//				Heuristic var = (Heuristic)x.newInstance();
//				System.out.println("2");
//				this.heuristics.add(var);
//			} catch (ClassNotFoundException e) {
//				e.printStackTrace();
//				System.out.println("Se ha ingresado un nombre de heur�stica que no existe1");
//			} catch (InstantiationException e) {
//				System.out.println("Se ha ingresado un nombre de heur�stica que no existe2");
//			} catch (IllegalAccessException e) {
//				System.out.println("Se ha ingresado un nombre de heur�stica que no existe3");
//			}
//		}

		if(heuristic.equals("Man"))
			this.heuristic = new H1();
		else if(heuristic.equals("DistFil"))
			this.heuristic = new H2();
		else if(heuristic.equals("PiErr"))
			this.heuristic = new H3(this.goalState);
			
//		for(String s:heuristics){
//			int a = new Integer(s);
//			
//			switch(a){
//				case 1: this.heuristics.add(new H1());
//						break;
//				case 2:	this.heuristics.add(new H2());
//						break;
//				case 3: this.heuristics.add(new H3());
//						break;
//			
//		}
		
	}
	
	@Override
	public GPSState getInitState() {
		return initState;
	}

	@Override
	public GPSState getGoalState() {
		return goalState;
	}

	@Override
	public List<GPSRule> getRules() {
		return rules;
	}

	@Override
	public Integer getHValue(GPSState state) {
		return this.heuristic.computeHeuristic(state);
	}

//	public static void main(String[] args){
//		
//		List<String> rules = new ArrayList<String>();
//		rules.add("H1");
//		rules.add("H2");
//		GPSProblem gp= new GPSProblemImpl(null, null, null, rules);
//		gp.getHValue(null);
//		
//	}
	
	
	
}
